using Gtk;
using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Globalization;
using System.Reflection;

using Serpis;
using PArticulo;


public partial class MainWindow : Gtk.Window
{
	public MainWindow () : base(Gtk.WindowType.Toplevel)
	{
		Build ();
		//**	Inicialmente cuando iniciamos el miTreeView, le pasamos una consulta especifica 'por defecto'
		miTreeView.Init(AppDbConnection.Instance.DbConnection, "SELECT * FROM articulo;");

		//**	La visualización de ciertos botones dependerá de si tengamos seleccionado algo en miTreeView
		editAction.Sensitive = false;
		deleteAction.Sensitive = false;
		newAction.Sensitive = true;
		
		miTreeView.Changed += delegate
		{
			if(miTreeView.HasSelected == true)
			{
				editAction.Sensitive = true;
				deleteAction.Sensitive = true;
				newAction.Sensitive = false;
			}
			else
			{
				editAction.Sensitive = false;
				deleteAction.Sensitive = false;
				newAction.Sensitive = true;
			}
		};
		
		findAction.Activated += delegate 
		{
			miTreeView.Refresh(entrySelect.Text);
		};
		
		editAction.Activated += delegate 
		{
			//Codigo para utilizar la clase Persister
			Persister persister= new Persister();
			
			//**	Creamos un articulo en base al metodo Load de la clase Persister, pasandole un tipo de objeto(Type) y un id(del registro seleccionado)
			Articulo articulo= (Articulo)persister.Load(typeof(Articulo), Convert.ToInt64(miTreeView.GetValue(0)));
			
			/*
			//**	Codigo para utilizar con el ArticuloPersister
			ArticuloPersister articuloPersister = new ArticuloPersister();
			long valor = Convert.ToInt64(miTreeView.GetValue(0));
			Articulo articulo = articuloPersister.Load(valor);refresh
			*/
			
			/*
			//**	Codigo para crer un articulo para provocar un error y mostrar así el expander del ValidatorViewAttribute
			* Articulo articulo = new Articulo();
			//articulo.Nombre = "articulo " + DateTime.Now;
			articulo.Nombre = "";
			articulo.Precio = 1001;
			articulo.Categoria = 2;
			*/
			ArticuloView articuloView = new ArticuloView();
			
			Controller controller = new Controller(articulo, articuloView);
			controller.Refresh();
			
			articuloView.Changed += delegate 
			{
				controller.Update();	
			};
			articuloView.SaveAction.Activated += delegate 
			{
				controller.Update();
				persister.Save(articulo);
				articuloView.Destroy();
				miTreeView.Refresh();				
			};
		};
		newAction.Activated += delegate
		{
			ArticuloNew articuloNew= new ArticuloNew();
			articuloNew.Save += delegate
			{
				Articulo articulo= new Articulo();
				articulo.Nombre= articuloNew.Nombre;
				articulo.Precio= articuloNew.Precio;
				articulo.Categoria= articuloNew.Categoria;		
				/*
				//	Codigo para utilizar con la clase ArticuloPersister
				ArticuloPersister articuloPersister = new ArticuloPersister();
				articuloPersister.Save(articulo);
				*/
				
				Persister persister = new Persister();
				persister.Save(articulo);
				articuloNew.Destroy();
				miTreeView.Refresh();
			};
			
		};
		deleteAction.Activated += delegate 
		{
			ArticuloPersister articuloPersister= new ArticuloPersister();
			Articulo articulo= articuloPersister.Load(Convert.ToInt64(miTreeView.GetValue(0)));
			articuloPersister.Delete(articulo);		
			miTreeView.Refresh();
		};
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}
}
